home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / ctutord.EXE / FPOINTER.C < prev    next >
C/C++ Source or Header  |  1993-07-16  |  3KB  |  150 lines

  1. /*    
  2.     ASSUMPTIONS:
  3.     EACH SCORE COULD AT MOST BE 100
  4.     THERE ARE 5 TOTAL SCORES
  5. */
  6. #define    MAX    5
  7. #define NULL 0
  8. struct student {
  9.     char    name[40];
  10.     int        scores[MAX];
  11.     char    grade;
  12. };
  13. struct classr {
  14.     int classnum;
  15.     struct     student    person[35];
  16.     void (*process)(struct student *);
  17. };
  18.  
  19. void ave( struct student *);
  20. void totpoints( struct student *);
  21. void calc( struct classr * );
  22. void printclass( struct classr * );
  23.  
  24. main()
  25. {
  26.     int i, select;
  27.  
  28.     /* initialized data structure with all class information */
  29.     static    struct    classr     cis123 = {
  30.         123456,  
  31.         {
  32.             { "rick", { 90, 67, 87, 88, 100 } },
  33.             { "john", { 90, 78, 85, 56, 87 } },
  34.             { "jim", { 90, 95, 78, 93, 88 } },
  35.             { "deb", { 90, 95, 78, 84, 87 } },
  36.             { "sam", { 90, 95, 67, 86, 99 } },
  37.             { "paul", { 78, 93, 88, 67, 77 } },
  38.             { "gary", { 90, 75, 78, 93, 98 } },
  39.             { "malia", { 90, 65, 99, 82, 100 } },
  40.             { "rachel", { 90, 99, 76, 89, 99 } },
  41.             { "", { 0, 0, 0, 0, 0 } }
  42.         },
  43.         0  /* function pointer place holder */
  44.     };
  45.  
  46.     /* Process type selection */
  47.     printf("How will class score be determined?\n");
  48.     printf("\t(1) Total Point Accumulation\n");
  49.     printf("\t(2) Total Point Average\n");
  50.     printf("\nEnter number: ");
  51.     scanf("%d", &select);
  52.  
  53.     /* Total Point Accumulation */
  54.     if(select == 1){
  55.         cis123.process = totpoints;
  56.         calc(&cis123);
  57.     }
  58.     /* Total Point Average */
  59.     else if(select == 2){
  60.         cis123.process = ave;
  61.         calc(&cis123);
  62.     }
  63.     /* Error */
  64.     else {
  65.         printf("Wrong selection!\n");
  66.         exit(1);
  67.     }
  68.  
  69.     /* Now print the class grades ... */
  70.     printclass(&cis123);
  71. }
  72.  
  73. /* 
  74.  * Calculate the grades of all students in a specific class
  75.  */
  76. void calc(struct classr *p1)
  77. {
  78.     int    i ;
  79.     for(i=0; p1->person[i].name[0] != 0; i++){
  80.         printf("Processing: %s's scores\n",p1->person[i].name); 
  81.         /*
  82.          * call the grade processing function 
  83.          * pass the address of one student structure
  84.          * for processing
  85.          */
  86.         (*p1->process)(&p1->person[i]) ;
  87.     }
  88. }
  89.  
  90. /* 
  91.  * Print the grades of all students in a specific class
  92.  */
  93. void printclass(struct classr *p1)
  94. {
  95.     int    i;
  96.     for(i=0; p1->person[i].name[0] != 0; i++)
  97.         printf("%s - Grade = %c\n", 
  98.                 p1->person[i].name, p1->person[i].grade);
  99. }
  100.  
  101. /* 
  102.  * Calculate a student's grade based on total point accumulation
  103.  */
  104. void totpoints( struct student *ptr)
  105. {
  106.     int    i, total=0;
  107.  
  108.     /* Calculate grade */
  109.     for(total=0, i=0; i<MAX; i++)
  110.         total += ptr->scores[i];
  111.  
  112.     /* Log grade */
  113.     if(total > 450)
  114.         ptr->grade = 'A';
  115.     else if(total > 400)
  116.         ptr->grade = 'B';
  117.     else if(total > 350)
  118.         ptr->grade = 'C';
  119.     else if(total > 300)
  120.         ptr->grade = 'D';
  121.     else
  122.         ptr->grade = 'F';
  123. }
  124.  
  125. /* 
  126.  * Calculate a student's grade based on total point average
  127.  */
  128. void ave( struct student *ptr )
  129. {
  130.     int    i, total=0;
  131.     float    grade;
  132.  
  133.     /* Calculate grade */
  134.     for(total=0, i=0; i<MAX; i++)
  135.         total += ptr->scores[i];
  136.     grade = total/MAX;
  137.  
  138.     /* Log grade */
  139.     if(grade > 90)
  140.         ptr->grade = 'A';
  141.     else if(grade > 80)
  142.         ptr->grade = 'B';
  143.     else if(grade > 70)
  144.         ptr->grade = 'C';
  145.     else if(grade > 60)
  146.         ptr->grade = 'D';
  147.     else
  148.         ptr->grade = 'F';
  149. }
  150.